/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package analiseSintatica;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSintatica.Regras.Expressoes.*;
import analiseSintatica.estruturadados.NoArvore;
import java.util.LinkedList;

/**
 *
 * @author linton
 */
public class Reconhecer_NaoTerminais {

    RegraLogicaE Regralogica_e =  RegraLogicaE.getInstance();
    RegraElementoVar regra_elementoVar = RegraElementoVar.getInstance();
    RegraOpIncremento regraOpIncremento = RegraOpIncremento.getInstance();
    ReconhecerTerminais reconhecerTerminais = new ReconhecerTerminais();
    RegraIgualdade regraIgualdade = RegraIgualdade.getInstance();
    RegraRelacional regraRelacional =  RegraRelacional.getInstance();
    RegraOpIgualdade regraOpIguadade =  RegraOpIgualdade.getInstance();
    RegraExpAritmetica regraExpAritmetica = RegraExpAritmetica.getInstance();
    RegraOpRelacional regraOpRelacional =  RegraOpRelacional.getInstance();


    public Reconhecer_NaoTerminais() {
    }

    public NoArvore reconhecerOpIncremento(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException {

        LinkToken token = listaTokens.getFirst();
        if (regraOpIncremento.getPrimeiro().contains(token.getToken())) {
            return regraOpIncremento.analisar(listaTokens);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta incremento", estrutura, token.getLinha());
        throw erro;

    }

    public NoArvore reconhecerLogica_e(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException {
        LinkToken token = listaTokens.getFirst();

        if (Regralogica_e.getPrimeiro().contains(token.getToken())) {
            return Regralogica_e.analisar(listaTokens);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Erro na logica e", estrutura, listaTokens.getFirst().getLinha());
        throw erro;

    }

    public NoArvore reconhecerElemento_Var(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException {

        LinkToken token = listaTokens.getFirst();

        if (regra_elementoVar.getPrimeiro().contains(token.getToken())) {
            return regra_elementoVar.analisar(listaTokens);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta Elemento_Var", estrutura, token.getLinha());
        throw erro;
    }

    public NoArvore reconhecerIgualdade(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException {

        LinkToken token = listaTokens.removeFirst();

        if (regraIgualdade.getPrimeiro().contains(listaTokens.getFirst().getToken())) {
            return regraIgualdade.analisar(listaTokens);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta identificador", estrutura, token.getLinha());
        throw erro;
    }


    public NoArvore reconhecerRelacional(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException {
        LinkToken token = listaTokens.getFirst();
        if (regraRelacional.getPrimeiro().contains(token.getToken())) {
            return regraRelacional.analisar(listaTokens);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta relacional", estrutura, token.getLinha());
        throw erro;

    }
    public NoArvore reconhecerOp_Igualdade(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException {
        LinkToken token = listaTokens.getFirst();
        if (regraOpIguadade.getPrimeiro().contains(token.getToken())) {
            return regraOpIguadade.analisar(listaTokens);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta operador de igualdade", estrutura, token.getLinha());
        throw erro;

    }
       public NoArvore reconhecerExp_Aritmetica(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException {
        LinkToken token = listaTokens.getFirst();
        if (regraExpAritmetica.getPrimeiro().contains(token.getToken())) {
            return regraExpAritmetica.analisar(listaTokens);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta expressao aritmetica", estrutura, token.getLinha());
        throw erro;

    }
    public NoArvore reconhecerOp_relacional(LinkedList<LinkToken> listaTokens, String estrutura) throws ErroSintaticoException {
        LinkToken token = listaTokens.getFirst();
        if (regraOpRelacional.getPrimeiro().contains(token.getToken())) {
            return regraOpRelacional.analisar(listaTokens);
        }
        ErroSintaticoException erro = new ErroSintaticoException();
        erro.addErros("Falta expressao aritmetica", estrutura, token.getLinha());
        throw erro;

    }

}
